/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package web.reclamos.dao.sql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import web.reclamos.beans.Coorporacion;
import web.reclamos.beans.Empresa;
import web.reclamos.beans.Reclamo;
import web.reclamos.beans.Tipo;
import web.reclamos.dao.EmpresaDao;
import web.reclamos.dao.ReclamoDao;
import web.reclamos.dao.exception.ExceptionReclamos;

public class ReclamoDaoSql implements ReclamoDao{

    public void crear(Reclamo entidad) throws ExceptionReclamos {
        
        //registrando fecha actual
        java.util.Date utilDate = new java.util.Date();
        java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
        //entra a creacion reclamo
        Connection cn = null;
        PreparedStatement pstm = null;
        ResultSet rs = null;
        ResultSet rs0 = null;
        try{
            cn = ConexionDB.getInstance().getConnection();

            //llamamos la ultima factura para crear el siguiente
            int id_fac0 = 0;
            String sqlID_fac = "select ifnull(max(id_factura),0) as id_fac from factura";
            pstm = cn.prepareStatement(sqlID_fac);
            rs = pstm.executeQuery();   //Traer id factura
            rs.next();
            id_fac0 = rs.getInt("id_fac");
            id_fac0 = id_fac0 + 1;
            //Registro Factura
            String sqlFactura = "insert into factura(id_factura, numero_factura) values (?,?)";
            pstm = cn.prepareStatement(sqlFactura);
            pstm.setInt(1, id_fac0);
            pstm.setString(2, entidad.getFactura().getNumero_factura());
            pstm.executeUpdate();
            
            //llamamos la ultima factura
            int id_fac = 0;
            String sqlID = "select ifnull(max(id_factura),0) as id_f from factura";
            //preparecall es para procedimientos almacenados
            pstm = cn.prepareStatement(sqlID);
            rs = pstm.executeQuery();   //Traer id factura
            rs.next();
            id_fac = rs.getInt("id_f");
            //llamamos ultimo reclamo
            int id_rec = 0;
            String sqlID_rec = "select ifnull(max(id_reclamo),0) as id_rec from reclamo";
            pstm = cn.prepareStatement(sqlID_rec);  //prepara la sentencia
            rs = pstm.executeQuery();   //Traer id factura
            rs.next();
            id_rec = rs.getInt("id_rec");
            id_rec = id_rec + 1;
            //***********************

            //Registro en Tabla Reclamos
            String sqlReclamo = "insert into reclamo (id_reclamo, codigo_reclamo, estado_reclamo, id_tipo, id_factura) values (?,?,?,?,?)";
            pstm = cn.prepareStatement(sqlReclamo);
            //entidad.getId_reclamo()
            pstm.setInt(1, id_rec);
            pstm.setString(2, entidad.getCodigo_reclamo());
            pstm.setString(3, entidad.getEstado_reclamo());
            pstm.setInt(4, entidad.getTipo().getId_tipo());
            //necesito el Id primero
            pstm.setInt(5, id_fac);
            pstm.executeUpdate();

            //llamamos el ultimo detalle
            int id_det = 0;
            String sqlID_det = "select ifnull(max(id_detalle),0) as id_det from detalle";
            pstm = cn.prepareStatement(sqlID_det);  //prepara la sentencia
            rs = pstm.executeQuery();   //Traer id factura
            rs.next();
            id_det = rs.getInt("id_det");
            id_det = id_det + 1;
            //Registro en la tabla Detalle de Factura
            String sqlDetalle = "insert into detalle (id_detalle, descripcion_detalle, fecha_creacion," +
                                " fecha_modificacion, id_reclamo) values (?,?,?,?,?)";
            pstm = cn.prepareStatement(sqlDetalle);
            pstm.setInt(1, id_det);
            pstm.setString(2, entidad.getDetalle());
            pstm.setDate(3, sqlDate);
            pstm.setDate(4, sqlDate);
            pstm.setInt(5, id_rec);
            pstm.executeUpdate();

            //el comit solo se hace cunado uso procedures
            //cn.commit();
        }catch(SQLException ex){
            System.out.println(ex);
        }catch(Exception ex){
              System.out.println(ex);
        }finally{
            ConexionDB.getInstance().close(pstm);
            ConexionDB.getInstance().close(cn);
        }
    }

    public void modificar(Reclamo entidad) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void eliminar(int id) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public Reclamo traerPorId(int id) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public List<Reclamo> traerTodo() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public List<Reclamo> traerPorNombre(String nombre) {
        Connection cn = null;
        PreparedStatement pstm = null;
        ResultSet rs = null;
        List<Reclamo> reclamos = new ArrayList<Reclamo>();
        Tipo tipo = new Tipo();
        try{
            cn = ConexionDB.getInstance().getConnection();
            String sql = "select * from reclamo where codigo_reclamo like ?";
            pstm = cn.prepareStatement(sql);
            pstm.setString(1, nombre + "%");
            rs = pstm.executeQuery();
            while(rs.next()){
                reclamos.add(new Reclamo(rs.getInt("id_reclamo"),
                                         rs.getString("codigo_reclamo"),
                                         rs.getString("estado_reclamo")                                         
                             ));
            }
        }catch(SQLException ex){
            System.out.println(ex);
        }catch(Exception ex){
              System.out.println(ex);
        }finally{
            ConexionDB.getInstance().close(rs);
            ConexionDB.getInstance().close(pstm);
            ConexionDB.getInstance().close(cn);
        }
        return reclamos;
    }


}
